home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / prg_casm / vidmgr13.zip / OPSYS.C < prev    next >
C/C++ Source or Header  |  1996-10-03  |  5KB  |  254 lines

  1. /*
  2.  *  OPSYS.C  Operating environment detection and time-slicing support for
  3.  *           MS-DOS applications.
  4.  *
  5.  *  Written in June 1996 by Andrew Clarke and released to the public domain.
  6.  */
  7.  
  8. #include <dos.h>
  9. #include "opsys.h"
  10.  
  11. int opsys_id = OS_MSDOS;
  12.  
  13. int opsysDetect(void)
  14. {
  15. #if defined(__TURBOC__)
  16.     /* detect DESQview */
  17.     _AX = 0x2B01;
  18.     _CX = 0x4445;
  19.     _DX = 0x5351;
  20.     geninterrupt(0x21);
  21.     if (_AL != 0xFF)
  22.     {
  23.         opsys_id = OS_DESQVIEW;
  24.         return opsys_id;
  25.     }
  26.  
  27.     /* detect OS/2 */
  28.     _AH = 0x30;
  29.     geninterrupt(0x21);
  30.     if (_AL >= 10)
  31.     {
  32.         opsys_id = OS_OS2;
  33.         return opsys_id;
  34.     }
  35.  
  36.     /* detect Windows */
  37.     _AX = 0x160A;
  38.     geninterrupt(0x2F);
  39.     if (_AX == 0)
  40.     {
  41.         opsys_id = OS_WINDOWS;
  42.         return opsys_id;
  43.     }
  44. #else
  45.     union REGS regs;
  46.  
  47.     /* detect DESQview */
  48. #if defined(__WATCOMC__) && defined(__386__)
  49.     regs.w.ax = 0x2B01;
  50.     regs.w.cx = 0x4445;
  51.     regs.w.dx = 0x5351;
  52.     int386(0x21, ®s, ®s);
  53. #else
  54.     regs.x.ax = 0x2B01;
  55.     regs.x.cx = 0x4445;
  56.     regs.x.dx = 0x5351;
  57. #ifdef __EMX__
  58.     _int86(0x21, ®s, ®s);
  59. #else
  60.     int86(0x21, ®s, ®s);
  61. #endif
  62. #endif
  63.     if (regs.h.al != 0xFF)
  64.     {
  65.         opsys_id = OS_DESQVIEW;
  66.         return opsys_id;
  67.     }
  68.  
  69.     /* detect OS/2 */
  70.     regs.h.ah = 0x30;
  71. #if defined(__WATCOMC__) && defined(__386__)
  72.     int386(0x21, ®s, ®s);
  73. #else
  74. #ifdef __EMX__
  75.     _int86(0x21, ®s, ®s);
  76. #else
  77.     int86(0x21, ®s, ®s);
  78. #endif
  79. #endif
  80.     if (regs.h.al >= 10)
  81.     {
  82.         opsys_id = OS_OS2;
  83.         return opsys_id;
  84.     }
  85.  
  86.     /* detect Windows */
  87. #if defined(__WATCOMC__) && defined(__386__)
  88.     regs.w.ax = 0x160A;
  89.     int386(0x2F, ®s, ®s);
  90.     if (regs.w.ax == 0)
  91.     {
  92.         opsys_id = OS_WINDOWS;
  93.         return opsys_id;
  94.     }
  95. #else
  96.     regs.x.ax = 0x160A;
  97. #ifdef __EMX__
  98.     _int86(0x2F, ®s, ®s);
  99. #else
  100.     int86(0x2F, ®s, ®s);
  101. #endif
  102.     if (regs.x.ax == 0)
  103.     {
  104.         opsys_id = OS_WINDOWS;
  105.         return opsys_id;
  106.     }
  107. #endif
  108. #endif
  109.  
  110.     /* must be MS-DOS */
  111.     opsys_id = OS_MSDOS;
  112.     return opsys_id;
  113. }
  114.  
  115. void opsysTimeSlice(void)
  116. {
  117. #if defined(__TURBOC__)
  118.     switch (opsys_id)
  119.     {
  120.     case OS_MSDOS:
  121.         geninterrupt(0x28);
  122.         break;
  123.     case OS_OS2:
  124.     case OS_WINDOWS:
  125.         _AX = 0x1680;
  126.         geninterrupt(0x2F);
  127.         break;
  128.     case OS_DESQVIEW:
  129.         _AX = 0x1000;
  130.         geninterrupt(0x15);
  131.         break;
  132.     case OS_DBLDOS:
  133.         _AX = 0xEE01;
  134.         geninterrupt(0x21);
  135.         break;
  136.     case OS_NETWARE:
  137.         _BX = 0x000A;
  138.         geninterrupt(0x7A);
  139.         break;
  140.     default:
  141.         break;
  142.     }
  143. #else
  144.     union REGS regs;
  145.     switch (opsys_id)
  146.     {
  147.     case OS_MSDOS:
  148. #if defined(__WATCOMC__) && defined(__386__)
  149.         int386(0x28, ®s, ®s);
  150. #else
  151. #ifdef __EMX__
  152.         _int86(0x28, ®s, ®s);
  153. #else
  154.         int86(0x28, ®s, ®s);
  155. #endif
  156. #endif
  157.         break;
  158.  
  159.     case OS_OS2:
  160.     case OS_WINDOWS:
  161. #if defined(__WATCOMC__) && defined(__386__)
  162.         regs.w.ax = 0x1680;
  163.         int386(0x2F, ®s, ®s);
  164. #else
  165.         regs.x.ax = 0x1680;
  166. #ifdef __EMX__
  167.         _int86(0x2F, ®s, ®s);
  168. #else
  169.         int86(0x2F, ®s, ®s);
  170. #endif
  171. #endif
  172.         break;
  173.  
  174.     case OS_DESQVIEW:
  175. #if defined(__WATCOMC__) && defined(__386__)
  176.         regs.w.ax = 0x1000;
  177.         int386(0x15, ®s, ®s);
  178. #else
  179.         regs.x.ax = 0x1000;
  180. #ifdef __EMX__
  181.         _int86(0x15, ®s, ®s);
  182. #else
  183.         int86(0x15, ®s, ®s);
  184. #endif
  185. #endif
  186.         break;
  187.  
  188.     case OS_DBLDOS:
  189. #if defined(__WATCOMC__) && defined(__386__)
  190.         regs.w.ax = 0xEE01;
  191.         int386(0x21, ®s, ®s);
  192. #else
  193.         regs.x.ax = 0xEE01;
  194. #ifdef __EMX__
  195.         _int86(0x21, ®s, ®s);
  196. #else
  197.         int86(0x21, ®s, ®s);
  198. #endif
  199. #endif
  200.         break;
  201.  
  202.     case OS_NETWARE:
  203. #if defined(__WATCOMC__) && defined(__386__)
  204.         regs.w.bx = 0x000A;
  205.         int386(0x7A, ®s, ®s);
  206. #else
  207.         regs.x.bx = 0x000A;
  208. #ifdef __EMX__
  209.         _int86(0x7A, ®s, ®s);
  210. #else
  211.         int86(0x7A, ®s, ®s);
  212. #endif
  213. #endif
  214.         break;
  215.  
  216.     default:
  217.         break;
  218.     }
  219. #endif
  220. }
  221.  
  222. #ifndef __EMX__
  223.  
  224. unsigned short opsysGetVideoSeg(unsigned short assumed_base)
  225. {
  226.     if (opsys_id == OS_DESQVIEW)
  227.     {
  228. #if defined(__TURBOC__)
  229.         _ES = assumed_base;
  230.         _DI = 0;
  231.         _AX = 0xFE00;
  232.         geninterrupt(0x10);
  233.         return _ES;
  234. #else
  235.         union REGS regs;
  236.         struct SREGS sregs;
  237.         sregs.es = assumed_base;
  238. #if defined(__WATCOMC__) && defined(__386__)
  239.         regs.w.di = 0;
  240.         regs.w.ax = 0xFE00;
  241.         int386x(0x10, ®s, ®s, &sregs);
  242. #else
  243.         regs.x.di = 0;
  244.         regs.x.ax = 0xFE00;
  245.         int86x(0x10, ®s, ®s, &sregs);
  246. #endif
  247.         return sregs.es;
  248. #endif
  249.     }
  250.     return assumed_base;
  251. }
  252.  
  253. #endif
  254.